/**
 * x instanceof y 的作用原理就是，在x的原型链上寻找y，如果找到了就返回true，如果找不到就返回false;
根据其作用原理，其实现过程也就呼之欲出了：首先判断x是不是object类型的，如果不是直接返回false就可以了。
如果是的话，则逐级比较x的原型和y是否相等，知道x原型链的尽头，也就是null。如果此时y与任何一层原型都不相等，则返回false，否则返回true
 * @param {*} obj 要判断的对象
 * @param {*} cons 构造函数
 * @returns 
 */

function myInstanceOf(obj, cons) {
  // 判断是否对象 Object(val)如果val是一个对象则返回源对象，否则是包装对象如Object(1)-<Number(1),null和undefined返回空对象{}
  if (Object(obj) !== obj) return false;
  let _p = obj.__proto__;
  while (_p != null) {
    if (_p === cons.prototype) return true;

    _p = _p.__proto__;
  }
  return false;
}

// eg
let arr = [];
console.log("[ myInstanceOf(arr,Array) ] >", myInstanceOf(arr, Array));
